package main

import (
	"Wangcache"
	"flag"
	"fmt"
	"log"
	"net/http"
)

//测试，实现main函数，实例化group，并启动HTTP服务
var db =map[string]string{
	"Tom":"630",
	"Jack":"589",
	"Sam":"567",
}
func createGroup()*Wangcache.Group{
	return Wangcache.NewGroup("scores",2<<10,Wangcache.GetterFunc(//创建一个group，同时注册get函数，用来从数据源获取数据
		func(key string) ([]byte, error) {
			log.Println("[SlowDB] search key",key)
			if v,ok:=db[key];ok{
				return []byte(v),nil
			}
			return nil,fmt.Errorf("%s not exist",key)
		}))
}
//用来启动缓存服务器：创建HTTPPool，添加节点信息，注册到Wang中，启动HTTP服务(共三个端口，8001/8002/8003)
func startCacheServer(addr string,addrs []string,wang *Wangcache.Group){
	peers:=Wangcache.NewHTTPPool(addr)
	peers.Set(addrs...)//为每个地址都创建出选择器
	wang.RegisterPeers(peers)//这样就知道，如果当前缓存里没有就知道到哪个地方去找了
	log.Println("wangcache is running at",addr)
	log.Fatal(http.ListenAndServe(addr[7:],peers))//监听的服务端口
}
//startApiServer用来启动一个API服务(端口9999),与用户进行交互，用户感知
func startAPIserver(apiAddr string,wang *Wangcache.Group){
	http.Handle("/api",http.HandlerFunc(
		func(w http.ResponseWriter, r *http.Request) {
			key:=r.URL.Query().Get("key")
			view,err:=wang.Get(key)
			if err!=nil{
				http.Error(w,err.Error(),http.StatusInternalServerError)
				return
			}
			w.Header().Set("Content-Type","application/octet-stream")
			w.Write(view.ByteSlice())
		}))
	log.Println("fontend server is running at",apiAddr)
	log.Fatal(http.ListenAndServe(apiAddr[7:],nil))
}
//main函数需要命令行传入port和api2个参数，用来在指定端口启动http服务
func main(){
	var port int
	var api bool
	flag.IntVar(&port,"port",8001,"WangCache server port")
	flag.BoolVar(&api,"api",false,"Start a api server")
	flag.Parse()

	apiAddr:="http://localhost:9999"
	addrMap:=map[int]string{
		8001:"http://localhost:8001",
		8002:"http://localhost:8002",
		8003:"http://localhost:8003",
	}
	var addrs []string
	for _,v:=range addrMap{
		addrs=append(addrs,v)
	}
	wang:=createGroup()//先创建出来一个缓存器
	if api{
		go startAPIserver(apiAddr,wang)
	}
	startCacheServer(addrMap[port],[]string(addrs),wang)//创建出来一个服务器，将缓存，注册的地址都传进去，当前服务器地址
}